on *:text:*:#:{
  if $regex(d,$1-,/^!(?i)domino\s(.+)/) {
    if (%d.domino) { .notice $nick Game is already inplay | return }
    if ($numtok($regml(d,1),32) != 4) { msg # $nick $+ : It's a four sides game. | return }
    filter -glwf # nul /\b(?: $replace($regml(d,1),$chr(32),|) )\b/xiSg
    if ($filtered != 4) { msg # select nicks that already on channel. }
    unset %d.*
    set %d.domino 1
    set %d.chan #
    set %d.players $strip($regml(d,1))
    tokenize 32 %d.players
    set %d.turn $1
    set %d.pieces $regsubex($scrambtok($pieces),/(?:\[0-3]|\[0-5]|\[0-6]|\[1-0]|\[1-2]|\[1-3]|\[1-4]|\[1-6]|\[2-0]|\[2-4]|\[2-6]|\[3-2]|\[3-5]|\[3-6]|\[4-0]|\[4-3]|\[4-5]|\[4-6]|\[5-1]|\[5-2]|\[6-5])/g,$null)
    set %d.player1 $1 | set %d.player2 $2 | set %d.player3 $3 | set %d.player4 $4
    set %d.player1p $token(%d.pieces,1-7,32) | set %d.player2p $token(%d.pieces,8-14,32) | set %d.player3p $token(%d.pieces,15-21,32) | set %d.player4p $token(%d.pieces,22-28,32)
    .notice %d.player1 DOMINOOS: %d.player1p | .notice %d.player2 DOMINOOS: %d.player2p | .notice %d.player3 DOMINOOS: %d.player3p | .notice %d.player4 DOMINOOS: %d.player4p
    .notice %d.turn DOMINOOS: Your turn to play.
    set %d.lpieces %d.pieces
    msg %d.chan Time to play DOMINOOS!
  }
  elseif ($1 == !cards) && ($istok(%d.players,$nick,32)) {
    .notice $nick DOMINOOS: $eval($+(%,d.player,$findtok(%d.players,$nick,1,32),p),2)
  }
  elseif ($1 == !left) && ($istok(%d.players,$nick,32)) {
    .notice $nick DOMINOOS: $regsubex($scrambtok(%d.lpieces),$+(/,$chr(40),$replace($eval($+(%,d.player,$findtok(%d.players,$nick,1,32),p),2),[,\[,$chr(32),|),$chr(41),/g),\t)
  }
  elseif ($1 == !count) && ($istok(%d.players,$nick,32)) {
    .notice $nick DOMINOOS: $+(%d.player1,:,$numtok(%d.player1p,32)) - $+(%d.player2,:,$numtok(%d.player2p,32)) - $+(%d.player3,:,$numtok(%d.player3p,32)) - $+(%d.player4,:,$numtok(%d.player4p,32))
  }
  elseif ($1 == !order) && ($istok(%d.players,$nick,32)) {
    .notice $nick DOMINOOS: $replace($(%d.player1 - %d.player2 - %d.player3 - %d.player4),%d.turn,$+($chr(22),%d.turn,$chr(22)))
  }
  elseif ($1 == !table) && ($istok(%d.players,$nick,32)) {
    .notice $nick DOMINOOS: $iif(%d.played,%d.played,No one played yet!)
  }
  elseif ($1 == !play) && ($2) && (%d.turn == $nick) && ($2 isin $eval($+(%,d.player,$findtok(%d.players,%d.turn,1,32),p),2)) || ($2 isin $replace($reverse($eval($+(%,d.player,$findtok(%d.players,%d.turn,1,32),p),2)),$+([,$chr(32),]),$+(],$chr(32),[))) {
    if (!%d.played) {
      set %d.played $2
      set $+(%,d.player,$findtok(%d.players,$nick,1,32),p) $remove($eval($+(%,d.player,$findtok(%d.players,%d.turn,1,32),p),2),$2)
      msg %d.chan $+($chr(2),%d.turn,:,$chr(2)) %d.played
      set %d.turn $gettok(%d.players,$iif($calc($findtok(%d.players,%d.turn,1,32) +1) > $numtok(%d.players,32),1,$v1),32)
      :check
      if ($dcheck(%d.turn) == no) {
        .notice %d.turn DOMINOOS: You've been passed!
        msg %d.chan $+($chr(2),%d.turn,$chr(2)) has been passed!
        set %d.turn $gettok(%d.players,$iif($calc($findtok(%d.players,%d.turn,1,32) +1) > $numtok(%d.players,32),1,$v1),32)
        goto check
      }
      .notice %d.turn DOMINOOS: Your turn to play.
      .notice %d.turn DOMINOOS: $eval($+(%,d.player,$findtok(%d.players,%d.turn,1,32),p),2)
      msg %d.chan $+($chr(2),%d.turn,$chr(2),'s) turn.
    }
  }
  elseif (%d.played) {
    var %a = $remove($replace(%d.played,][,*),[,])
    if ($remove($right($2,2),]) == $remove($left(%d.played,2),[)) || ($remove($left($2,2),[) == $remove($right(%d.played,2),])) || ($remove($right($reverse($2),2),]) == $remove($left(%d.played,2),[)) || ($remove($left($reverse($2),2),[) == $remove($right(%d.played,2),])) {
      set %d.lastp $2
      if ($3) { if ($istok(r l,$3,32)) && ($regex(%d.played,$remrpt($+(/[,$remove($remove($replace(%d.lastp,-,$chr(32)),[,]),$chr(32)),]/g))) == 2) { goto $3 } }
      if ($istok($remove(%d.lastp,[,]),$left(%a,1),$asc(-))) { :l | set %d.sort 1 | set %d.side l | goto next }
      elseif ($istok($remove(%d.lastp,[,]),$right(%a,1),$asc(-))) { :r | set %d.sort $len(%d.played) | set %d.side r | goto next }
      :next
      set %d.lastp $dsort(%d.lastp)
      set $+(%,d.player,$findtok(%d.players,$nick,1,32),p) $remove($eval($+(%,d.player,$findtok(%d.players,%d.turn,1,32),p),2),$iif(%d.lastp !isin $eval($+(%,d.player,$findtok(%d.players,%d.turn,1,32),p),2),$reverse(%d.lastp),%d.lastp))
      set %d.played $remove($instok(%d.played,%d.lastp,%d.sort,32),$chr(32))
      msg %d.chan $+($chr(2),%d.turn,:,$chr(2)) $iif(%d.side == l,$regsubex(%d.played,/(\[\S+?])(.+)/,\1\2),$regsubex(%d.played,/(.+)(\[\S+?])/,\1\2))
      if ($numtok($eval($+(%,d.player,$findtok(%d.players,$nick,1,32),p),2),32) == 0) { dend $nick | return }
      set %d.lpieces $remove(%d.lpieces,$iif(%d.lastp !isin %d.lpieces,$reverse(%d.lastp),%d.lastp))
      set %d.turn $gettok(%d.players,$iif($calc($findtok(%d.players,%d.turn,1,32) +1) > $numtok(%d.players,32),1,$v1),32)
      if ($numtok($eval($+(%,d.player,$findtok(%d.players,$nick,1,32),p),2),32) == 1) { msg %d.chan $+($chr(2),$nick,$chr(2)) has 1 domino left! }
      if ($dcheckb == yes) { msg %d.chan Block by $+($chr(2),$nick,$chr(2)) caused end of game. No one wins! | unset %d.* | return }
      :check
      if ($dcheck(%d.turn) == no) {
        .notice %d.turn DOMINOOS: You've been passed!
        msg %d.chan $+($chr(2),%d.turn,$chr(2)) has been passed!
        set %d.turn $gettok(%d.players,$iif($calc($findtok(%d.players,%d.turn,1,32) +1) > $numtok(%d.players,32),1,$v1),32)
        goto check
      }
      .notice %d.turn DOMINOOS: Your turn to play.
      .notice %d.turn DOMINOOS: $eval($+(%,d.player,$findtok(%d.players,%d.turn,1,32),p),2)
      msg %d.chan $+($chr(2),%d.turn,$chr(2),'s) turn.
    }
  }
}

on *:part:%d.chan:if ($istok(%d.players,$nick,32)) { tokenize 32 $remove(%d.players,$nick) | .notice $* DOMINOOS: $nick has part the channel. end of game | unset %d.* }
on *:kick:%d.chan:if ($istok(%d.players,$nick,32)) { tokenize 32 $remove(%d.players,$nick) | .notice $* DOMINOOS: $nick has been kicked the channel. end of game | unset %d.* }
on *:quit:if ($istok(%d.players,$nick,32)) { tokenize 32 $remove(%d.players,$nick) | .notice $* DOMINOOS: $nick has quit the channel. end of game | unset %d.* }
on *:nick:{
  if ($istok(%d.players,$nick,32)) set %d.players $replace(%d.players,$nick,$newnick)
  if (%d.turn == $nick) set %d.turn $newnick
}

alias dcheckb {
  var %a = %d.lpieces, %b = $remove($left(%d.played,2),[), %c = $remove($right(%d.played,2),])
  if (!$regex(%b,$remrpt($+([,$remove($remove($replace(%a,-,$chr(32)),[,]),$chr(32)),])))) && (!$regex(%c,$remrpt($+([,$remove($remove($replace(%a,-,$chr(32)),[,]),$chr(32)),])))) return yes
}
alias dcheck {
  var %a = $1, %b = $eval($+(%,d.player,$findtok(%d.players,%a,1,32),p),2), %c = $remove($left(%d.played,2),[), %d = $remove($right(%d.played,2),])
  if (!$regex(%c,$remrpt($+([,$remove($remove($replace(%b,-,$chr(32)),[,]),$chr(32)),])))) && (!$regex(%d,$remrpt($+([,$remove($remove($replace(%b,-,$chr(32)),[,]),$chr(32)),])))) return no
}
alias dsort {
  var %a = $1
  if (%d.side = l) && ($remove($right(%a,2),]) != $remove($left(%d.played,2),[)) { return $reverse(%a) }
  elseif (%d.side = r) && ($remove($left(%a,2),[) != $remove($right(%d.played,2),])) { return $reverse(%a) }
  return %a
}
alias dend {
  var %a = 1
  msg %d.chan $+($chr(2),$1,$chr(2)) wens!
  msg %d.chan $+($chr(22),Runners up:)
  window -h @dscore
  while (%a <= 4) {
    if (%a != $findtok(%d.players,$1,1,32)) aline @dscore $+($chr(2),$chr(40),$chr(2),$numtok($($+(%,d.player,%a,p),2),32),$chr(2),$chr(41),$chr(2)) $+($chr(2),$($+(%,d.player,%a),2),$chr(2)) $($+(%,d.player,%a,p),2)
    inc %a
  }
  filter -cewwt 2 2 @dscore @dscore
  %a = 3
  while (%a) {
    msg %d.chan $token($line(@dscore,%a),2-,32) $token($line(@dscore,%a),1,32)
    dec %a
  }
  window -c @dscore
  unset %d.*
}
alias pieces {
  unset %d.bpieces
  var %a = 0,%b = 0
  :loop
  set %d.bpieces $addtok(%d.bpieces,$+([,%a,-,%b,]),32)
  inc %b
  if (%b <= 6) goto loop
  %b = 0
  inc %a
  if (%a <= 6) goto loop
  return %d.bpieces
}
alias scrambtok {
  var %a = $1, %b = $regex(x,%a,/(\S+)/g)
  while %b { var %x = $iif($r(1,0),%x $regml(x,%b),$regml(x,%b) %x) | dec %b }
  return %x
}
alias reverse return $replacex($regsubex($1,/(.)/g,$mid($1,\0,1)),[,],],[)
alias remrpt return $regsubex($1,/(?<=\[)(.)(?=.*\1\])/,)